Windows API имеет набор функций, которые позволяют описать произвольную геометрическую фигуру. Такие фигуры можно потом использовать как при работе с окнами, так и в терминологии Delphi, либо с элементами управления. Особенно широко регионы применяются в формах Delphi (примеры смотрите на форуме программистов, http://www.cyberforum.ru/). Поэтому для начала расскажем, что такое регион.
Win32 SDK регион выглядит таким образом:
- В Microsoft Windows регионом именуется эллипс, прямоугольник или полигон, которые могут быть обрамлены, заполнены, инвертированы, нарисованы и могут использоваться для нахождения места курсора.
- В SDK есть три основных типа регионов: полигональные, эллиптические и прямоугольные. Дело в том, что любой регион может быть скомбинирован друг с другом при помощи логических операций OR, XOR и других. Если смотреть с точки зрения Windows, регион определяется как обыкновенный объект GDI, который задается дескриптором HRGN. Такой же тип доступен и в Delphi, он выглядит так: HRGN = type LongWord;
- В Win32 SDK _RGNDATA сделано иначе, наиболее интересная часть — это TRgnDataHeader, которую рассмотрим более подробно.
nRgnSize — размер буфера, который необходим структуры TRect, назначающей координаты прямоугольников. При неизвестном размере поле равняется нулю;
dwSize — назначает размер заголовка в байтах;
nCount — количество прямоугольников, составляющих регион;
iType — тип региона, который равен постоянной величине 1;
rcBound — координаты прямоугольника вписанного региона.
Данная структура как раз задаёт регион, с ней и работают почти все функции API. Условно их можно разделить на три группы: отрисовка, создание/удаление и прочие. Рассмотрим каждый по порядку.
Функции создания/удаления регионов Delphi, можно сказать про последнюю функцию DeleteObject, что она в явном виде не фигурирует, и в раздел по работе с регионами она не включена, это связано с тем, что она предназначена для несколько более широкого использования. На форуме delphi (http://www.cyberforum.ru/delphi/) выяснили, что в общем смысле она удаляет любой объект GDI, после чего освобождает все ресурсы, отведённые под этот объект. Для тех, кто совсем мало разбирается в Delphi, SDK нежно уточняет, что после вызова данной функции, ссылка на объект удаления становится неопределённой.
Прочих функций Delphi великое множество и описывать их все не имеет смысла. Озвучим как регионы комбинируются. Результат комбинирования определяется CombineRgn. Рассмотрим возможные значения:
- RGN_ADD – создает пересечение двух регионов p2 и p3;
- RGN_COPY – создаёт копию одного региона p2;
- RGN_DIFF – возвращает часть p2, которая не является частью p3;
- RGN_OR – помогает объединить два региона p2 и p3;
- RGN_XOR – помогает объединить регионы p2 и p3, за исключением пересекающихся областей.
Рисование регионов необходимо не только для того, чтобы изображать отверстия в формах Delphi. Зачастую – это полезный инструмент для отрисовки на экране очень сложных геометрических фигур. Неизмеримо полезны они для вывода карт, которые представляются очень большим количеством ломаных линий, которые построены по массивам точек.